package cn.edu.zafu.bigdata.fui;

abstract class Shape {
    public abstract double area();
    public abstract double perimeter();
    public final void display(){
        System.out.println("Shape: " + this.getClass().getSimpleName());
        System.out.println("Area: " + area());
        System.out.println("Perimeter: " + perimeter());
    }
}

class Circle extends Shape {
    private double radius;
    public Circle(double radius)
    {
        this.radius = radius;
    }
    public double area()
    {
        return Math.PI * radius * radius;
    }
    public double perimeter()
    {
        return 2 * Math.PI * radius;
    }
}

class Rectangle extends Shape {
    private double length;
    private double width;

    Rectangle(double x, double y){
        this.length = x;
        this.width = y;
    }

    public double area(){
        return length * width;
    }
    public double perimeter(){
        return 2 * (length + width);
    }
}

public class TestShape {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        Rectangle rectangle = new Rectangle(4.0, 6.0);
        circle.display();
        rectangle.display();
    }
}
/*
1.编写一个抽象类 Shape，该类包含：
一个 抽象方法 public abstract double area()，用于计算形状的面积。
一个 抽象方法 public abstract double perimeter()，用于计算形状的周长。
一个 final方法 public final void display()，用于打印形状的类型、面积和周长。

2.编写两个具体的形状类 Circle 和 Rectangle，它们继承自 Shape，并且：
Circle 类具有属性 radius（半径），并实现 area() 和 perimeter() 方法。
Rectangle 类具有属性 length（长度）和 width（宽度），并实现 area() 和 perimeter() 方法。

3.编写一个类 TestShape，在 main 方法中：
创建 Circle 和 Rectangle 的实例。
调用每个实例的 display() 方法，验证 final 方法是否能被子类重写。
验证抽象类的工作原理以及强制子类实现的行为。

4.编写代码验证 final 关键字的不同用法：
尝试创建一个 final 类，并观察该类是否能被继承。
尝试创建一个 final 方法，并观察该方法是否能被子类重写。
使用 final 关键字修饰一个变量，观察该变量的行为是否可以被修改。
*/
